home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 24
/
Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso
/
Aminet
/
dev
/
c
/
AmiVoGL_MDEV.lha
/
drivers
/
ibmpc
/
egachar.asm
< prev
next >
Wrap
Assembly Source File
|
1991-07-18
|
6KB
|
279 lines
TITLE EGA/VGA Fast character drawing routines.
NAME EGACHAR
PAGE 55,132
COMMENT $
Name: egaschar, egalchar
Function: Draws characters from the BIOS character set
to the video buffer in EGA and VGA graphics modes.
egaschar() - 8 x 8 character cell
egalchar() - 8 x 14 character cell
Caller: Microsoft C
void egaschar(x, y, c, n);
void egalchar(x, y, c, n);
int x, y; /* co-ords of upper left pixel of char */
int c; /* the character */
int n; /* its colour */
Notes:
The code in these routines has been optimized for speed,
not readibility. As much as possible is put into registers.
Replication of large blocks of code has been used in some
places to avoid calling subroutines.
Taken from J.D. MacDonald's Fastega package.
$
EGA_DATA segment word public 'DATA'
first8 dw 0
first14 dw 0
EGA_DATA ends
_CONST segment word public 'CONST'
fourt dw 14
_CONST ends
_BSS segment word public 'BSS'
es8 dw ?
bp8 dw ?
es14 dw ?
bp14 dw ?
_BSS ends
argbase equ 2
DGROUP GROUP _CONST, _BSS, EGA_DATA
assume cs:VEGA_TEXT, ds: DGROUP, ss: DGROUP, es: DGROUP
extrn __buffer_segment:word
VEGA_TEXT SEGMENT BYTE PUBLIC 'CODE'
public _egaschar
_egaschar proc far
push bp
mov bp,sp
push di
push si
cmp first8,0 ;get address of bios table of characters
jne sec8
inc first8 ;done only first time this routine is called
mov ah, 011h
mov al, 030h
mov bh, 03
push bp ;(gasp)Bios call destroys BP
int 010h
mov ax,es
mov es8,ax
mov bp8,bp
pop bp
sec8:
xor ax,ax
mov al,byte ptr [bp+argbase+8] ;this is the character
;look up location of ascii characters
mov cl,3
shl ax,cl ;in bios
add ax,bp8
mov si,ax
mov ax,word ptr [bp+argbase+4] ;this is x
mov dx,ax
and dx,7 ;break into bit and byte
mov cl,3
sar ax,cl
mov [bp+argbase+8],ax ;byte #
mov [bp+argbase+4],dx ;bit in byte
mov ax, __buffer_segment ; segment of display buffer
mov es,ax
push ds
mov ax,es8 ; segment for bios reference
mov ds,ax ; used to
mov bx,8 ;find character
jmp commonl
_egaschar endp
public _egalchar
_egalchar proc far
push bp
mov bp,sp
push di
push si
cmp first14,0 ;works just like slettr : done again for speed
jne sec14
inc first14
mov ah, 011h
mov al, 030h
mov bh, 02
push bp
int 010h
mov ax,es
mov es14,ax
mov bp14,bp
pop bp
sec14:
xor ax,ax
mov al,byte ptr [bp+argbase+8]
mul fourt
add ax,bp14
mov si,ax
mov ax,word ptr [bp+argbase+4]
mov dx,ax
and dx,7
mov cl,3
sar ax,cl
mov [bp+argbase+8],ax
mov [bp+argbase+4],dx
mov ax, __buffer_segment
mov es,ax
push ds
mov ax,es14
mov ds,ax
mov bx,14
commonl:
; symbol, slettr, and llettr the same after this
; compute location of byte to change
mov ax,word ptr [bp+argbase+6] ;this is y
mov dx,ax
shl dx,1
shl dx,1
add ax,dx
mov cl,4
shl ax,cl
add ax,[bp+argbase+8] ;this is horiz byte number
mov di,ax
mov dx,3ceh ; change SET/RESET register
mov al,00h ; to contain the color to write.
out dx,al
mov dx,3cfh
mov ax,word ptr [bp+argbase+10] ; <-- color
out dx,al
mov dx,3ceh ;point controller to bit mask register
mov al,08h
out dx,al
mov dx,3cfh
cmp word ptr [bp+argbase+8],0ffffh ;special case:partially off
;left edge of screen
je loop2m1
cmp word ptr [bp+argbase+8],79 ;Partially off right edge
je loop2p1
cmp word ptr [bp+argbase+8],80 ;totally off screen horizontally
jae commf
loop2:
xor ax,ax
mov ah,ds:[si+0] ;get pattern of current row
mov cx,[bp+argbase+4]
shr ax,cl ;shr to get two bytes
out dx,al
inc byte ptr es:[di+1] ;actual screen write
mov al,ah
out dx,al
inc byte ptr es:[di] ;write second byte
add di,80 ;next row
inc si
dec bx
jg loop2
jmp commf
loop2m1:
xor ax,ax ;leftmost byte is off screen
mov ah,ds:[si+0] ;get current row pattern
mov cx,[bp+argbase+4]
shr ax,cl ;shr to get two bytes
out dx,al
inc byte ptr es:[di+1] ;actual screen write
add di,80
inc si
dec bx
jg loop2m1
jmp commf
loop2p1:
xor ax,ax ;rightmost byte is off screen
mov ah,ds:[si+0] ;get current row pattern
mov cx,[bp+argbase+4]
shr ax,cl ;shr to get two bytes
mov al,ah
out dx,al
inc byte ptr es:[di]
add di,80
inc si
dec bx
jg loop2p1
commf:
pop ds
pop si
pop di
pop bp
ret
_egalchar endp
public _zsetup
_zsetup proc far
push dx
push ax
mov dx,3c4h ; allow writing to all planes
mov al,02h ; can be changed by setmask
out dx,al
mov dx,3c5h
mov al,0fh
out dx,al
mov dx,3ceh ; change ENABLE SET/RESET register
mov al,01h ; to use SET/RESET feature
out dx,al
mov dx,3cfh
mov al,0fh
out dx,al
pop ax
pop dx
ret
_zsetup endp
public _setmask
_setmask proc far
; set mask register setmask(mask)
push bp
mov bp,sp
mov cx,word ptr [bp+argbase+4]
mov dx,03c4h
mov al,2
out dx,al
mov dx,03c5h
mov al,cl
out dx,al
pop bp
ret
_setmask endp
VEGA_TEXT ENDS
end